/**
 * 
 */
package com.woniuxy.amusementparkos.permission.Service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.woniuxy.amusementparkos.dao.fzw.RoleDao;
import com.woniuxy.amusementparkos.entity.fzw.Power;
import com.woniuxy.amusementparkos.entity.fzw.Role;
import com.woniuxy.amusementparkos.exception.fzw.RoleException;
import com.woniuxy.amusementparkos.exception.fzw.RoleInUseException;
import com.woniuxy.amusementparkos.permission.Service.RoleService;

/**
 *
 * @author fzw
 *
 * 2020年4月29日上午6:42:23
 */
@Service
public class RoleServiceImp implements RoleService {
	//自动注入
	@Autowired
	RoleDao roleDao;
	
	/**
	 * 无条件查询所有角色信息
	 */
	@Override
	public List<Role> selectAllRole() throws RuntimeException {
		return roleDao.selectAllRole();
	}
	/**
	 * 根据页码查询一页的角色信息
	 */
	@Override
	public List<Role> selectAllRoleByPageNumber(Integer page, Integer limit) throws RuntimeException{
		return roleDao.selectAllRoleByPageNumber((page-1)*10,limit);
	}
	/**
	 * 插入角色信息
	 */
	@Override
	public void insertRole(Role role) throws RoleException{
		roleDao.insertRole(role);
	}
	/**
	 * 修改角色信息
	 */
	// 启用事务控制
	@Transactional
	@Override
	public void updateRole(Role role) throws RoleException{
		// 修改主表，这里可以直接修改的好处是因为建立了关联表的关系
			roleDao.updateRole(role);
		// 再修改用户关联表中的：用户&角色关联表
		// 根据user对象存放的Role对象集合中的role_id来依次更新用户与角色对应关系
		// 提取user中的Role集合，并拿到role_id
		// 先删再添加修改的角色&权限信息
			roleDao.deleteRoleAndPowerByRoleId(role.getRole_id());
		// 再重新添加
		for (Power power : role.getPowers()) {
			roleDao.insertRoleAndPowerByRoleId(role.getRole_id(), power.getPower_id());
		}
	}
	/**
	 * 删除角色
	 */
	@Override
	public void deleteRoles(int[] role_ids) throws RoleException{
		roleDao.deleteRoles(role_ids);
	}
	/**
	 * 检查用户是否存在
	 */
	@Override
	public void selectRoleByRoleIds(int[] role_ids) throws RoleInUseException{
			//默认为-1，若查到用户，则根据-1判断
			int user_id=-1;
			//创建一个集合用来存放用户正在使用的角色id
			List<Integer> usingRole = new ArrayList<Integer>();
			for(Integer role_id:role_ids) {
			user_id=-1;//重新赋值
			user_id=roleDao.selectUserInUserAndRoleById(role_id);
			//如果查询到用户不为空，则说明该角色正在被使用，则存放在数组里
			if(user_id!=-1) {
				usingRole.add(role_id);
			}
		}
			//最后判断数组里是否存放有已被用户使用的角色，有则抛异常，无法删除
			if(!usingRole.isEmpty()) {
				//将正在使用的角色名查询出来
				String[] roleNames=roleDao.selectRolesByIds(usingRole);
				String names="";
				for(String name:roleNames) {
					names+=name+"、";
				}
				names=names.substring(0,names.length()-1);
				throw new RoleInUseException("角色：  "+names+"      正在使用中，无法删除！");
			}
	}
	@Override
	public Long selectCount() {
		return roleDao.selectCount();
	}

}
